package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.AddressBook;
import com.itheima.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/addressBook")
@Slf4j
public class AddressBookController {
    @Autowired
    private AddressBookService addressBookService;

    /**
     * 新增地址
     * @param addressBook
     * @return
     */
    @PostMapping
    public R<AddressBook> save(@RequestBody AddressBook addressBook) {
        // 添加当前用户的id，让当前用户与这个地址绑定
        addressBook.setUserId(BaseContext.getCurrentId());
        // 将数据添加到数据库中
        addressBookService.save(addressBook);
        // 将 AddressBook 对象返回
        return R.success(addressBook);
    }

    /**
     * 设置默认地址
     * @param addressBook 要设置的默认地址
     * @return 返回成功设置后的默认地址
     */
    @PutMapping("/default")
    public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {
        // 1.创建更新的 wrapper
        LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
        // 2.添加查询条件
        // 2-1 查找所有与当前登录用户相关联的地址
        wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
        // 2-2 将这些地址的 isDefault 字段全部设置为0(为了防止之前已经有默认地址)
        wrapper.set(AddressBook::getIsDefault, 0);
        // 3.调用方法，执行更新
        addressBookService.update(wrapper);

        // 4.将当前这个地址的 idDefault 字段设置为 1
        addressBook.setIsDefault(1);
        // 5.更新字段
        addressBookService.updateById(addressBook);

        return R.success(addressBook);
    }

    /**
     * 获取默认地址
     * @return 返回默认的地址对象，如果不存在默认地址，则返回提示信息
     */
    @GetMapping("/default")
    public R<AddressBook> getDefault() {
        // 构建查询条件
        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();
        // 当前用户的地址
        wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
        // 默认的地址
        wrapper.eq(AddressBook::getIsDefault, 1);

        // 查询
        AddressBook addressBook = addressBookService.getOne(wrapper);

        // 返回结果
        if (addressBook == null) {
            return R.error("没有找到该对象");
        } else {
            return R.success(addressBook);
        }
    }

    /**
     * 根据id查询
     * @param id 根据这个 id 查询地址
     * @return 返回查询结果
     */
    @GetMapping("/{id}")
    public R<AddressBook> get(@PathVariable Long id) {
        AddressBook addressBook = addressBookService.getById(id);
        if (addressBook != null) {
            return R.success(addressBook);
        } else {
            return R.error("没有找到该对象");
        }
    }

    /**
     * 返回与当前用户关联的所有收货地址信息
     * @param addressBook 该对象的任何属性都没有被赋值，只是为了在 wrapper 中使用 和 存储一下userId
     * @return 返回查询到的所有地址数据(空 or 列表)，
     */
    @GetMapping("/list")
    public R<List<AddressBook>> list(AddressBook addressBook) {
        // 获取当前用户的 id
        addressBook.setUserId(BaseContext.getCurrentId());

        // 查询当前用户所有关联的地址
        LambdaQueryWrapper<AddressBook> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(addressBook.getUserId() != null, AddressBook::getUserId, addressBook.getUserId());
        wrapper.orderByDesc(AddressBook::getUpdateTime);

        // 返回结果
        return R.success(addressBookService.list(wrapper));
    }
}
